package Agents;

import Param.Constants;
import sim.engine.Steppable;

public class Virus {
	private float contaminationRate;
	private boolean isActive;
	private Steppable host;
	
	public Virus(Steppable host) {
		this.contaminationRate = 0;
		this.host = host;
		this.isActive = false;
	}
	
	/**
	 * Constructeur pour initialiser un virus 
	 * En communiquant si le virus est actif ou non (il l'est pour un cadavre)
	 * @param host
	 * @param isActive
	 */
	public Virus(Steppable host, boolean isActive)
	{
		this.contaminationRate = 0;
		this.host = host;
		this.isActive = isActive;
	}
	
	public void setHost(Steppable host) {
		this.host = host;
	}
	
	public void step(){
		if (isActive) {
			contaminationRate += Constants.VIRUS_INCREASE;
		}
		if (contaminationRate >= 1){
			transform();
		}
	}
	
	/**
	 * Augmente le taux de contamination
	 */
	/*public void increaseRate() {
		contaminationRate += Constants.VIRUS_INCREASE;
	}*/
	
	/**
	 * Déclenche la contamination
	 */
	public void contaminate() {
		isActive = true;
	}
	
	/**
	 * Transforme le porteur du virus en zombie
	 */
	private void transform() {
		if(host instanceof Human){
			/*int x = ((Human)host).getPos().x;
			int y = ((Human)host).getPos().y; 
			Common.removeRectangles(((Human)host).model.yard, x, y);*/
			Human human = (Human)host;
			if(human.getLife() <= 0) {
				// Se transforme d'abord en cadavre, gere par la methode survive()
			}
			else if(human.getAge() > Constants.HUMAN_EXPECTANCY) {
				// Se transforme d'abord en cadavre, gere par la methode getOld()
			}
			else {
				human.turnIntoZombie();
			}
		}
		else if(host instanceof Corpse){
			/*int x = ((Corpse)host).getPos().x;
			int y = ((Corpse)host).getPos().y; 
			Common.removeRectangles(((Corpse)host).model.yard, x, y);*/
			((Corpse)host).turnIntoZombie();
		}
	}
	
	public boolean isActive(){
		return this.isActive;
	}
}
